 1.Spark 原理
   
   Spark 原理主要包括 ：
       核心组件的运行机制(Master、Worker、SparkContext等)
       任务调度的原理
       Shuffle原理
       内存管理
       数据倾斜处理
       Spark优化
 
 2.Spark Runtime
   
   通用的流程：
       Using spark-submit, the user submits an application.
       In spark-submit, we invoke the main() method that the user specifies. It also launches the driver
program.
       The driver program asks for the resources to the cluster manager that we need to launch executors.
       The cluster manager launches executors on behalf of the driver program.
       The driver process runs with the help of user application. Based on the actions and transformation on
RDDs, the driver sends work to executors in the form of tasks.
       The executors process the task and the result sends back to the driver through the cluster manager.
   1).核心组件
   Master(Cluster Manager)：集群中的管理节点，管理集群资源，通知 Worker 启动 Executor 或 Driver。
   Worker ：集群中的工作节点，负责管理本节点的资源，定期向Master汇报心跳，接收Master的命令，启动Driver
或 Executor。
   Driver：执行 Spark 应用中的 main 方法，负责实际代码的执行工作。其主要任务：
        负责向集群申请资源，向master注册信息
        Executor启动后向 Driver 反向注册
        负责作业的解析、生成Stage并调度Task到Executor上
        监控Task的执行情况，执行完毕后释放资源
        通知 Master 注销应用程序
   Executor：是一个 JVM 进程，负责执行具体的Task。Spark 应用启动时， Executor节点被同时启动，并且始终伴随
着整个 Spark 应用的生命周期而存在。如果有 Executor 节点发生了故障或崩溃， 会将出错节点上的任务调度到其他
Executor 节点上继续运行。Executor 核心功能：
         负责运行组成 Spark 应用的任务，并将结果返回给 Driver 进程
         通过自身的 Block Manage 为应用程序缓存RDD		
   2).集群部署模式
   Spark 支持 3 种集群管理器，分别为：
       Standalone：独立模式，Spark 原生的简单集群管理器，自带完整的服务，可单独部署到一个集群中，无需依
赖任何其他资源管理系统，使用 Standalone 可以很方便地搭建一个集群；
       Hadoop YARN：统一的资源管理机制，在上面可以运行多套计算框架，如MapReduce、Storm 等，根据
driver 在集群中的位置不同，分为 yarn client 和 yarn cluster；
       Apache Mesos：一个强大的分布式资源管理框架，它允许多种不同的框架部署在其上；
   Spark 的运行模式取决于传递给 SparkContext 的 Master 环境变量的值， 个别模式还需要辅助的程序接口来配合使
用，目前支持的 Master 字符串及 URL 包括：
   Master URL         Meaning
   local             本地运行，只有一个工作进程，无并行计算能力
   local[K]          本地运行，有 K 个工作进程，通常设置 K 为机器的 CPU 核心数量
   local[*]          本地运行，工作进程数量等于机器的 CPU 核心数量。
   spark://HOST:PORT 以Standalone模式运行,这是Spark自身提供的集群运行模式,默认端口号: 7077
   yarn-client       Yarn 集群上运行，Driver 进程在本地，Work 进程在 Yarn 集群上， 
                     部署模式必须使用固定值：--deploy-mode client。Yarn 集群地址 
                     必须在HADOOP_CONF_DIR 或YARN_CONF_DIR 变量里定义
   yarn-cluster      Yarn 集群上运行，Driver 进程在 Yarn 集群上，Work 进程也在 Yarn 
                     集群上,部署模式必须使用固定值：--deploy-mode cluster。Yarn 
                     集群地址必须在HADOOP_CONF_DIR 或 YARN_CONF_DIR 变量里定义
   mesos://HOST:PORT 在 Mesos 集群上运行,Driver 进程和 Worker 进程运行在Mesos 
                     集群上,部署模式必须使用固定值:--deploy-mode cluster
   提交任务时，以下参数共同决定了 Spark 运行方式：
       master MASTER_URL ：决定了 Spark 任务提交给哪种集群处理
      deploy-mode DEPLOY_MODE：决定了Driver的运行方式,可选值为 Client(缺省值)或 Cluster
   3).Yarn模式运行机制
   (1).Yarn Cluster 模式(生产)
       Client先RM提交请求，并上传jar到HDFS上
       RM在集群中选择一个NM，在其上启动AppMaster，在AppMaster中实例化SparkContext(Driver)
       AppMaster向RM注册应用程序，注册的目的是申请资源。RM监控App的运行状态直到结束
       AppMaster申请到资源后，与NM通信，在Container中启动Executor进程
       Executor向Driver注册，申请任务
	   Driver对应用进行解析，最后将Task发送到Executor上
       Executor中执行Task，并将执行结果或状态汇报给Driver
       应用执行完毕，AppMaster通知RM注销应用，回收资源
   (2).Yarn Client 模式(调试)
       启动应用程序实例化SparkContext，向RM申请启动AppMaster
       M在集群中选择一个NM，在其上启动AppMaster
       AppMaster向RM注册应用程序，注册的目的是申请资源。RM监控App的运行状态直到结束
       AppMaster申请到资源后，与NM通信，在Container中启动Executor进程
       Executor向Driver注册，申请任务
       Driver对应用进行解析，最后将Task发送到Executor上
       Executor中执行Task，并将执行结果或状态汇报给Driver
       应用执行完毕，AppMaster通知RM注销应用，回收资源
   (3).Client模式与Cluster模式的区别
   client模式：
        Driver运行在客户端
        适用于调试，能直接看见各种日志
        连接断了，任务就挂了
   cluster模式：
        Driver运行在AppMaster中（运行在集群中）
        适合于生产，日志需要登录到某个节点才能看到
        连接断了，任务不受影响